package sensorLAN.UIServidor;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//import java.util.LinkedList;
//import javax.swing.event.TableModelEvent;
//import javax.swing.event.TableModelListener;
import sensorLAN.utiles.Fecha;
import clienteServidor.DatosEquipo;
import clienteServidor.excepciones.ElementoNoEncontrado;

/**
 *
 * @author Cesar
 */
class ModeloTabla extends DefaultTableModel{

	/**
	 * 
	 */
	private static final long serialVersionUID = -2192409925909645445L;
	public static final Vector<String> NOMBRE_COLUMNAS= inicializarVectorNombres();

	//private List<TableModelListener> oyentes;

	private ModeloTabla(int cantidadFilas, Object valor) {
		super(NOMBRE_COLUMNAS, cantidadFilas);
		//oyentes= new LinkedList<TableModelListener>();
		int ct= NOMBRE_COLUMNAS.size();
		Object[] fila;
		for(int i= 0; i < cantidadFilas; i++){
			fila= new Object[ct];
			for(int j= 0; j < ct; j++){
				fila[j]= valor;
			}
			this.addRow(fila);
		}
	}

	public ModeloTabla() {
		this(0, null);
	}

	private static Vector<String> inicializarVectorNombres() {
		Vector<String> v= new Vector<String>();
		for(NombreColumnas n: NombreColumnas.values()){
			v.add(n.getDescripcion());
		}
		return v;
	}

	@Override
	public String toString() {
		StringBuilder sb= new StringBuilder();
		for(String fila: this.getDatos()){
			sb.append(fila+"\n");
		}
		return sb.toString();
	}

	public List<String> getDatos(){
		String separador= ";";
		List<String> filas= new ArrayList<String>();		
		int cantFilas= this.getRowCount(), cantCol= this.getColumnCount();
		StringBuilder sb= new StringBuilder();
		for(NombreColumnas n: NombreColumnas.values()){
			sb.append(n.getDescripcion()+separador);
		}
		filas.add(sb.toString());
		for(int i= 0; i < cantFilas; i++){
			sb= new StringBuilder();
			for(int j= 0; j < cantCol; j++){
				sb.append(this.getValueAt(i, j)+separador);
			}
			filas.add(sb.toString());
		}		
		return filas;
	}

	private Vector<Object> datoAVector(DatosEquipo de, int nro, String nota){
		Vector<Object> res= new Vector<Object>();
		res.add(nro);
		res.add(de.getMac());
		res.add(de.getIp());
		res.add(de.getNombreEquipo());
		res.add(de.getUsuario());
		res.add(de.isConectadoALan());
		res.add(de.getEstadoBateria());
		res.add(de.getDetalleBateria());
		res.add(de.getVersionCliente());
		/*float m= ((float)de.getMemoriaLibre()/de.getMemoriaTotal())*100.0f;
		DecimalFormat f = new DecimalFormat("#.00");
		res.add(de.getMemoriaLibre()+"/"+de.getMemoriaTotal()+ " ("+f.format(m)+"%)");
		res.add(de.getUsoCpu());*/
		long aux= (Fecha.getMarcaTiempo()-de.getMarcaTiempoRecepcion());
		res.add((Math.round(aux/1000)));
		res.add(nota);
		return res;
	}

	public void agregarDatoEquipo(DatosEquipo dato) {
		int idxFila;
		//System.err.println("Existe?: "+dato.getIp());
		try {
			idxFila = this.buscarSiExiste(dato);
			//this.addRow(this.datoAVector(dato, idx+1));
			//this.removeRow(idx);
			this.actualizarFila(dato, idxFila);
		} catch (ElementoNoEncontrado e) {
			idxFila= this.getDataVector().size() + 1;
			this.addRow(this.datoAVector(dato, idxFila, ""));
		}
	}

	@SuppressWarnings("unchecked")
	private int buscarSiExiste(DatosEquipo dato) throws ElementoNoEncontrado{
		Vector<Object> vFila= null;
		String mac;
		int fila= 0;
		Vector<Object> datos= this.getDataVector();
		for(Object o: datos){
			vFila= (Vector<Object>)o;
			mac= (String) vFila.get(NombreColumnas.MAC.getNroColumna());
			if(mac.equals(dato.getMac())){
				return fila;
			}
			fila++;
		}
		throw new ElementoNoEncontrado(); 
	}

	@SuppressWarnings("unchecked")
	private void actualizarFila(DatosEquipo de, int fila){
		String notaAnterior= (String) this.getValueAt(fila, NombreColumnas.NOTA.getNroColumna());
		this.dataVector.set(fila, this.datoAVector(de, fila+1, notaAnterior));
		this.fireTableDataChanged();
	}

	@Override
	public boolean isCellEditable(int row, int column) {
		return column == NombreColumnas.NOTA.getNroColumna();
	}

	@Override
	public Class<?> getColumnClass(int c) {
		/*
		int i= 0;
		for(NombreColumnas n: NombreColumnas.values()){
			if(i == c) return n.getClass();
		}
		if(1== c)*/ return NombreColumnas.values()[c].getClase();
		//return String.class;
	};

	public static void main(String[] args) {
		ModeloTabla m= new ModeloTabla(10, "Hola");
		System.out.println(m);
	}
}
